package com.dependencies.springdataredis;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author zhizhou   2024/8/17 12:02
 */
@RestController
public class RedisController {
    private final RedisService redisService;
    
    public RedisController(RedisService redisService) {
        this.redisService = redisService;
    }
    
    @GetMapping("/set")
    public String setKey(@RequestParam String key, @RequestParam String value) {
        redisService.saveValue(key, value);
        return "保存成功";
    }
    
    @GetMapping("/get")
    public String getKey(@RequestParam String key) {
        return redisService.getValue(key);
    }
    
    
    //启动项目后，使用以下 URL 进行测试：
    //
    //保存哈希数据: http://localhost:8080/hash/set?key=user:1001&field=name&value=John
    //
    //这将保存一个哈希键值对，键为 user:1001，字段为 name，值为 John。
    //获取哈希数据: http://localhost:8080/hash/get?key=user:1001&field=name
    //
    //这将从哈希 user:1001 中获取 name 字段的值。
    //删除哈希字段: http://localhost:8080/hash/delete?key=user:1001&field=name
    //
    //这将从哈希 user:1001 中删除 name 字段。
    //获取所有哈希数据: http://localhost:8080/hash/getall?key=user:1001
    //
    //这将返回哈希 user:1001 中的所有字段和值。
    
    @GetMapping("/hash/set")
    public String setHash(@RequestParam String key, @RequestParam String field, @RequestParam String value) {
        redisService.saveToHash(key, field, value);
        return "哈希值保存成功";
    }
    
    // 获取哈希中的数据
    @GetMapping("/hash/get")
    public String getHash(@RequestParam String key, @RequestParam String field) {
        return redisService.getFromHash(key, field);
    }
    
    // 删除哈希中的某个字段
    @GetMapping("/hash/delete")
    public String deleteHashField(@RequestParam String key, @RequestParam String field) {
        redisService.deleteFromHash(key, field);
        return "哈希字段已删除";
    }
    
    // 获取哈希中的所有字段和值
    @GetMapping("/hash/getall")
    public Map<String, Object> getAllHash(@RequestParam String key) {
        return redisService.getAllFromHash(key);
    }
    
    
    //启动项目后，可以通过以下 URL 测试 Redis 列表的功能：
    //
    //向列表左侧推入值: http://localhost:8080/list/leftpush?key=myList&value=value1
    //
    //这会将 value1 推入到列表 myList 的左侧。
    //向列表右侧推入值: http://localhost:8080/list/rightpush?key=myList&value=value2
    //
    //这会将 value2 推入到列表 myList 的右侧。
    //从列表左侧弹出值: http://localhost:8080/list/leftpop?key=myList
    //
    //这会从列表 myList 的左侧弹出一个值。
    //从列表右侧弹出值: http://localhost:8080/list/rightpop?key=myList
    //
    //这会从列表 myList 的右侧弹出一个值。
    //获取列表中所有值: http://localhost:8080/list/getall?key=myList
    //
    //这会获取列表 myList 中的所有值。
    // 向列表左侧推入值
    @GetMapping("/list/leftpush")
    public String leftPushToList(@RequestParam String key, @RequestParam String value) {
        redisService.pushToListLeft(key, value);
        return "值被推到列表的左侧";
    }
    
    // 向列表右侧推入值
    @GetMapping("/list/rightpush")
    public String rightPushToList(@RequestParam String key, @RequestParam String value) {
        redisService.pushToListRight(key, value);
        return "值被推到列表的右侧";
    }
    
    // 从列表左侧弹出值
    @GetMapping("/list/leftpop")
    public String leftPopFromList(@RequestParam String key) {
        return redisService.popFromListLeft(key);
    }
    
    // 从列表右侧弹出值
    @GetMapping("/list/rightpop")
    public String rightPopFromList(@RequestParam String key) {
        return redisService.popFromListRight(key);
    }
    
    // 获取列表中所有值
    @GetMapping("/list/getall")
    public List<Object> getAllFromList(@RequestParam String key) {
        return redisService.getList(key);
    }
    
    //Set 操作:
    //
    //添加成员到集合: http://localhost:8080/set/add?key=mySet&value=value1
    //获取集合中的所有成员: http://localhost:8080/set/members?key=mySet
    //检查成员是否在集合中: http://localhost:8080/set/ismember?key=mySet&value=value1
    //删除集合中的成员: http://localhost:8080/set/remove?key=mySet&value=value1
    //Sorted Set 操作:
    //
    //添加成员到有序集合: http://localhost:8080/zset/add?key=myZSet&value=value1&score=1.0
    //获取有序集合中的成员范围: http://localhost:8080/zset/range?key=myZSet&start=0&end=-1
    //删除有序集合中的成员: http://localhost:8080/zset/remove?key=myZSet&value=value1
    //HyperLogLog 操作:
    //
    //添加成员到 HyperLogLog: http://localhost:8080/hyperloglog/add?key=myHLL&value=value1
    //获取 HyperLogLog 的基数估算: http://localhost:8080/hyperloglog/count?key=myHLL
    //Bitmap 操作:
    //
    //设置 Bitmap 中某个位的值: http://localhost:8080/bitmap/set?key=myBitmap&offset=7&value=true
    //获取 Bitmap 中某个位的值: http://localhost:8080/bitmap/get?key=myBitmap&offset=7
    // Set操作
    @GetMapping("/set/add")
    public String addToSet(@RequestParam String key, @RequestParam String value) {
        redisService.addToSet(key, value);
        return "值已加入集合set";
    }
    
    @GetMapping("/set/members")
    public Set<Object> getSetMembers(@RequestParam String key) {
        return redisService.getSetMembers(key);
    }
    
    @GetMapping("/set/ismember")
    public boolean isMemberOfSet(@RequestParam String key, @RequestParam String value) {
        return redisService.isMemberOfSet(key, value);
    }
    
    @GetMapping("/set/remove")
    public String removeFromSet(@RequestParam String key, @RequestParam String value) {
        redisService.removeFromSet(key, value);
        return "值已从集合set移除";
    }
    
    // Sorted Set操作
    @GetMapping("/zset/add")
    public String addToSortedSet(@RequestParam String key, @RequestParam String value, @RequestParam double score) {
        redisService.addToSortedSet(key, value, score);
        return "值已加入有序集合sorted set";
    }
    
    @GetMapping("/zset/range")
    public Set<Object> getSortedSetRange(@RequestParam String key, @RequestParam long start, @RequestParam long end) {
        return redisService.getSortedSetRange(key, start, end);
    }
    
    @GetMapping("/zset/remove")
    public String removeFromSortedSet(@RequestParam String key, @RequestParam String value) {
        redisService.removeFromSortedSet(key, value);
        return "值已从有序集合sorted set移除";
    }
    
    // HyperLogLog操作
    @GetMapping("/hyperloglog/add")
    public String addToHyperLogLog(@RequestParam String key, @RequestParam String value) {
        redisService.addToHyperLogLog(key, value);
        return "Value added to HyperLogLog";
    }
    
    @GetMapping("/hyperloglog/count")
    public long countInHyperLogLog(@RequestParam String key) {
        return redisService.countInHyperLogLog(key);
    }
    
    // Bitmap操作
    @GetMapping("/bitmap/set")
    public String setBit(@RequestParam String key, @RequestParam long offset, @RequestParam boolean value) {
        redisService.setBit(key, offset, value);
        return "Bit set in bitmap";
    }
    
    @GetMapping("/bitmap/get")
    public boolean getBit(@RequestParam String key, @RequestParam long offset) {
        return redisService.getBit(key, offset);
    }
    
}
